#include "funch.h"
#define erro1 "Erro na string"

void str_upper(char *string, int tamanho)
{
	int i;
	
	//caso em que nao foi passado string
	if(string == NULL)
	{
    printf(erro1);
		return;
  }
  else
  	for(i=0;i<tamanho;i++)
      //transforma a letra em maiuscula
      string[i] = toupper(string[i]);
}

char** strtoken(char *str, int *n)
{
	int i=0;
	int tamstr = strlen(str);
	char** array_of_string;
	
	*n=0;
	array_of_string = (char**)malloc(sizeof(char*)*(tamstr+1));
  //busca por espaco no texto
	array_of_string[0]=strtok(str," ");
  //insere cada apontador da palavra num vetor
  for((*n)=1;(*n)<tamstr;(*n)++)
  {
    array_of_string[*n]=strtok(NULL," ");
    if(array_of_string[*n]==NULL)
    break;
  }
  return array_of_string;
}

void str_spaces(char *str, char *str1)
{
  int i=0, j=0;
  
  while(str[i]!='\0')
  {
    //retira cada duplo ou mais espacos entre palavras e arruma a string numa nova string
    if(j==0)
      while(j==0 && str[i]==' ')
        i++;
    if(str[i]==' ' && str[i+1]==' ')
	    ++i;
    else
		{
		  str1[j]=str[i];
		  j++;
		  i++;
    }
	}
	//insere \0 no final da string para poder utilizar funcoes para string
  if(str1[j-1]==' ')
  	str1[j-1]='\0';
  else
    str1[j]='\0';
    		
  str1 = (char*)realloc(str1,(strlen(str1)+1)*sizeof(char)); 
}

ap_list list_new()
{
  ap_list lista;
	
  lista = (ap_list)malloc(sizeof(list));
  //inicializa lista
	lista->freq = 0;
  lista->nxt = NULL;
	lista->word = NULL;
  return lista;
}

void cria_no( ap_list lista, char *pal)
{
	ap_list aux;
	ap_list no = (ap_list)malloc(sizeof(list));
	
	//inicializa a lista com a palavra separada e sua frequencia com 1
	no->freq = 1;
  no->nxt = NULL;
	no->word = pal;
	for(aux = lista;aux->nxt != NULL; aux = aux->nxt); //encontra o fim da lista
	aux->nxt = no;
}

void free_malloc(ap_list lista)
{
  ap_list aux=NULL, aux1=NULL;
  
  //percorre a lista liberando-a
  if(lista != NULL)
		for(aux = aux1 = lista; aux1 != NULL; aux = aux1)
		{
			aux1 = aux->nxt;
			free(aux);
		}	
}

int charfrequency(char * str , char *letra)
{
  int i=0;
  char *ptr;
  ptr = (char *) memchr(str,*letra, strlen(str));
  
  //verifica a frequencia utilizando memchr
  while(ptr != NULL)
  {
    i++;
    ptr = (char *) memchr(ptr+1, *letra, (strlen(str)-(ptr-str))); 
  }
  return i;
}

int strfrequency(char *str, char *pal)
{  
  int i=0, comparador=0;
  char *ptr1, *end;  
  ptr1= str;
  end = ptr1 + strlen(str);    
  
  //verifica a frequencia usando memcmp
  while(ptr1 <= end)
  {
    comparador = memcmp(ptr1++ ,pal, strlen(pal));
    if(comparador == 0){
      i++;
    }
  }
  return i;
}

ap_list list_freq(char** str, int tam)
{
  int i=0;
	ap_list atual,no;
	
  no = list_new();
	atual=no;
  while(i < tam)
  {
    if(no->word == NULL)
    {
      //pega as palavras tokenizadas e insere numa lista
  	  no->freq = 1;
      no->nxt = NULL;
  	  no->word = str[i];
  	  i++;
    }
    else
    {
      while(atual != NULL)
      {
        //eh feita uma busca com cada palavra do texto, caso encontrada igual,
        //frequencia incrementa
        if(!strcmp(str[i], atual->word))
        {
          atual->freq++;
          break;
        }
        else
          atual=atual->nxt;
      }
      if(atual==NULL)
      {
        atual=no;
        cria_no(no,str[i]);
        i++;
      }
      else
        if(tam!=i)
        {          
          atual=no;
          i++;
        }
    }               
  }
  //imprime a lista e cria o arquivo com a frequencia e as palavras 
	list_print(no);  
  file_create(no);
  return no;
}

void alfanum(char *str)
{
  int i=0;
	
	//busca qualquer simbolo(nao letra ou numero) no texto e troca por espaco
  while(str[i]!='\0')
  {
    if(isalnum(str[i])==0)
      str[i]=' ';
    i++;
  }  
}

void list_print(ap_list lista)
{
	ap_list aux;
	
	//percorre a lista imprimindo-a
	for(aux = lista;aux != NULL;aux = aux->nxt)
	{
		printf("%s - ", aux->word);
    printf("%d\n", aux->freq);
	}
}

void file_create(ap_list lista)
{
	ap_list aux;
	FILE *archive;
	archive = fopen("arquivo.txt", "w");
	//imprime no arquivo a palavra, o ; e a frequencia de cada
	for(aux = lista; aux != NULL; aux = aux->nxt)
		fprintf(archive, "%s;%d\n", aux->word, aux->freq);
		
	fclose(archive);
}

char** abre_pega (char* file) 
{
	FILE* ap_file;

	char *vetor, *a, *t=0;
	char** aux;
	long file_size;
	int n_sep=0,i=0,tam=0, ask=0; //variaveis auxiliares
	int c;
	
/*pegar ponteiro do arquivo e ver seu tamanho*/
	ap_file = fopen(file,"r");
	if (ap_file == NULL)
		{
			printf ("arquivo nao encontrado\n");	
      return NULL;	
		}

	fseek(ap_file, 0, SEEK_END); //coloca o cursor no final do arquivo
	file_size = ftell(ap_file)+1;	 //le o numero de bytes ate o final do arquivo
	fseek (ap_file, 0, SEEK_SET); //coloca o cursor no comeco do arquivo
	
/*cria vetor com o tamanho do arquivo*/
	vetor = (char*) malloc (sizeof(char)*file_size);
	
/*coloca os elementos do arquivo no vetor*/
	fgets (vetor, file_size, ap_file);

//verifica se ha campos em branco


  t = strstr(vetor, SEP SEP); //se nao encontrar, retorna NULL
  a = strchr(SEP, vetor[0]); //se o primeiro caracter for um SEPARADOR, ja avisa q existe campo faltante
  n_sep = charfrequency(vetor , SEP); //se nao houver pelo menos 3 separadores, existe campo faltante
  
  if (t != NULL || a != NULL || n_sep < 3)
    {
      printf("Existe campo faltante\n");
      return NULL;
    }
    

//cria um vetor auxiliar onde os dados serao mantidos
        aux = (char**) malloc (sizeof(char*)*file_size);

	/*tokeniza o vetor que e armazenado em um vetor auxiliar*/ 
	
//string
	aux[0] = strtok(vetor, SEP);
        	if (aux[0] == NULL)
		{
			printf ("string nao encontrada\n");
			return NULL;
		}
	printf ("string: %s\n", aux[0]);
	
//caractere		
	aux[1] = strtok(NULL, SEP);
        tam = strlen(aux[1]);
        ask = isalnum(aux[1][0]); //se houver algo nao alfanum, retorna 0
	if (aux[1] == NULL)
		{
			printf ("caractere nao encontrado\n");
      return NULL;			
		}
	else if (ask == 0 || tam!=1)
		{
			printf ("Existe mais de um caractere ou caractere invalido\n");
      return NULL;				
		}
	printf ("caractere: %s\n", aux[1]);


//palavra
	aux[2] = strtok(NULL, SEP);
        tam = strlen(aux[2]); //pega o tamanho da palavra

	if (aux[2] == NULL || tam == 0) 
		{
			printf ("palavra nao encontrada\n");
			return NULL;
		}

/*verifica se ha mais uma palavra*/
	for (i=0;i<tam;i++)
		{
			ask = isalnum(aux[2][i]); //se for alnum, retorna 0
			if (ask == 0)
				{
					printf ("existe mais de uma palavra ou caracter invalido na palavra\n");
					return NULL;
					break;
				}		
		}		
	printf ("palavra: %s\n", aux[2]);
	
/*libera o vetor alocado e fecha o arquivo*/
//	free (vetor);
  aux[3]=vetor;
	fclose(ap_file);
  return aux;
}

  ///////////////////////// AQUIIIIIIIIIIIIIIIIIIIIIIII
char* strtoken2(char *str)
{
	int i=0;
	int tam=0;
  char *straux = NULL;
  char *ret=NULL;
 
  char a;
  straux=strpbrk(str,seps);
  a = *straux;
  *straux='\0';
  tam=strlen(str);
  ret=(char*) malloc (sizeof(char)*tam);
  strcpy(ret,str);
  *straux= a ;
  
 // str=strrstr(str,ret);

  return ret;
}

/*

char *strrstr (const char *s, const char *t)
{
  size_t i, j, tlen = strlen (t);


  for (i = strlen (s); i >= tlen; i--)
    {
      for (j = 0; j < tlen && s[i - tlen + j] == t[j]; j++)
	;
      if (j == tlen)
	return (char *) (s + i - tlen);
    }


  return NULL;
}
*/
